<?php
/**
 * CCrudManager class file.
 *
 * @author Lucas Vasconcelos <contato@lucasvasconcelos.com>
 * @copyright Copyright(c) 2010 Lucas Vasconcelos
 * @license BSD License http://www.lucasvasconcelos.com/yap/license
 * @link http://www.lucasvasconcelos.com/yap/
 * @version $Id: CCrudManager.php 13 2010-02-02 18:17:39Z contato@lucasvasconcelos.com $
 * @package yap.web.ui
 */

Prado::using('yap.web.ui.interfaces');

/**
 * CCrudManager class.
 * 
 * Encampsula rotinas para controlar o formulário de classes que implementam a interface {@link IPageCrud}.
 * 
 * @author Lucas Vasconcelos <contato@lucasvasconcelos.com>
 * @version 1.0 $Revision: 13 $
 * @package yap.web.ui
 */
class CCrudManager
{
	private $_parent=null;
	
	/**
	 * Construtor :)
	 */
	public function __construct(IPageCrud $parent)
	{
		$this->_parent=$parent;
	}
	
	/**
	 * Popula campos do formulário automaticamente.
	 * Passe como parâmetro um array associativo cujas chaves devem ser
	 * o alias para o grupo de campos alvo.
	 * 
	 * Ex.: array('users' => $record)
	 * 
	 * 'users' é o grupo de campos alvo, $record é um objeto (geralmente TActiveRecord)
	 * com os valores que devem popular os campos do grupo alvo.
	 * 
	 * @param array
	 */
	public function autoBindFields($data)
	{
		// captura o alias e o nome do campo.
		$regex='/^'.IPageCrud::FIELD_PREFIX.'([a-z]+)_(\w+)/i';

		// busca controles do formulário cujo ID senha iniciado com o valor definido em CCrudManager::FIELD_PREFIX.
		$controls=CCtrlFinder::findAllById($this->_parent, '/^'.IPageCrud::FIELD_PREFIX.'/');

		foreach($controls as $ctrl)
		{
			preg_match($regex, $ctrl->getID(), $m);
			if(isset($data[$m[1]]) && $data[$m[1]] instanceof TActiveRecord && property_exists($data[$m[1]], $m[2]))
			{
				$v=$data[$m[1]]->{$m[2]};

				if($ctrl instanceof TDatePicker)
					$ctrl->setDate(CDate::dbToFormat($v, $ctrl->getDateFormat()));
				else if($ctrl instanceof TCheckBox || $ctrl instanceof TRadioButton)
					$ctrl->setChecked(TPropertyValue::ensureBoolean($v));
				else if($ctrl instanceof TDropDownList)
					$ctrl->setSelectedValue($v);
				else if($ctrl instanceof TTextBox || $ctrl instanceof THtmlArea)
					$ctrl->setText($v);
			}
		}
	}
	
	/**
	 * Popula atributos do objeto passado com os valores do grupo de campos indicado.
	 * Se um grupo de campos não for especificado, usa o padrão definido por {@link getAliasId AliasId}.
	 * @param object Objeto que deve ser populado. Geralmente uma instancia de TActiveRecord.
	 * @param string|null Id do grupo de campos fonte.
	 */
	public function autoBindRecord($record,$alias=null)
	{
		if($alias===null) $alias=$this->_parent->getAliasId();
		$regex='/^'.IPageCrud::FIELD_PREFIX.$alias.'_(\w+)/';

		// busca controles do formulário cujo ID senha iniciado com o valor definido em CCrudManager::FIELD_PREFIX.
		$controls=CCtrlFinder::findAllById($this->_parent, '/^'.IPageCrud::FIELD_PREFIX.'/');

		foreach($controls as $ctrl)
		{
			preg_match($regex, $ctrl->getID(), $m);
			if(property_exists($record, $m[1]))
			{
				if($ctrl instanceof TDatePicker)
					$record->{$m[1]}=CDate::toDbFormat($ctrl->getDate(), $ctrl->getDateFormat());
				else if($ctrl instanceof TCheckBox || $ctrl instanceof TRadioButton)
					$record->{$m[1]}=TPropertyValue::ensureInteger($ctrl->getChecked());
				else if($ctrl instanceof TDropDownList)
					$record->{$m[1]}=$ctrl->getSelectedValue();
				else if($ctrl instanceof TTextBox || $ctrl instanceof THtmlArea)
					$record->{$m[1]}=$ctrl->getText();
			}
		}	
	}
	
	/**
	 * Alterna exibição dos paineis 'pn_form' e 'pn_grid'.
	 * @param string deve ser um dos valores definidos em {@link CActionType}.
	 */
	public function changeToPanel($value)
	{
		TPropertyValue::ensureEnum($value,'CPanelName');
		$this->_parent->pn_form->setVisible($value===CPanelName::pn_form);
		$this->_parent->pn_grid->setVisible($value===CPanelName::pn_grid);
	}
}